Kontrola vytvoreni instance tridy

Otázka od: Petr Langer

23. 10. 2002 9:18

Navazuju na diskusi ohledne metody free a testovani na nil.

procedure test;
var
  newForm : TForm;
begin
  ... kod...

*** V tomhle miste potrebuju zjistit, jesli newForm byla vytvorena (napr.
newForm := TForm.Create;) nebo ne. Jelikoz jsem ale na zacatku nedal newForm
:= nil, newForm.free mi v takovem pripade nejspise vyhuci s Exception.

end;

Lze tedy zjistit, jesli instance tridy existuje nebo je to jenom nesmyslny
ukazatel?

diky
    Petr Langer


Odpovedá: Ondrej Kelle

23. 10. 2002 10:42

> Lze tedy zjistit, jesli instance tridy existuje nebo je to
> jenom nesmyslny ukazatel?

Nie. Musi to byt napisane tak, aby bolo v kazdom kroku zarucene, ze je tam
bud platny odkaz na vytvorenu instanciu, alebo nil. V praxi to znamena, vzdy
inicializovat na nil, a pri uvolnovani opet priradit nil (na to sa hodi
FreeAndNil).

Napriklad takyto pseudokod:

procedure Bla;
var
  Query: TQuery;
  I: Integer;
begin
  Query := nil;
  try
    for I := 0 to ItemCount -1 do
      if Items[I].SomeCondition then
      begin
        if not Assigned(Query) then
        begin
          Query := TQuery.Create(nil);
          Query.Database := MyDataBase;
          Query.SQL.Text := MySQLText;
          Query.Prepare;
        end;
        Query.Params[0].AsInteger := Items[I].MyInteger;
        ...
        Query.Open;
        while not Query.EOF do
        begin
          ...
          Query.Next;
        end;
      end;
  finally
    FreeAndNil(Query);
  end;
end;

HTH
TOndrej